#include <iostream>
#include <string>
//#include <pthread.h>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <thread>

using namespace std;


// //C++11方法
// void run1(){
//     while(1){
//         cout << "thread 1" << endl;
//         sleep(1);
//     }
// }

// void run2(){
//     while(1){
//         cout << "thread 2" << endl;
//         sleep(1);
//     }
// }

// void run3(){
//     while(1){
//         cout << "thread 3" << endl;
//         sleep(1);
//     }
// }

// int main(){

//     //创建线程
//     thread th1(run1);
//     thread th2(run2);
//     thread th3(run3);

//     //等待线程
//     th1.join();
//     th2.join();
//     th3.join();

//     return 0;
// }



// // //全局变量被所以线程所共享
// // int val = 100;

// //构建每个线程的局部存储
// __thread int val = 100;

// string hexAddr(pthread_t tid){
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%x", tid);
//     return buffer;
// }

// void* threadRoutine(void* args){

//     //子线程自己分离
//     pthread_detach(pthread_self());

//     string name = static_cast<const char *>(args);
//     int cnt = 5;
//     while(cnt){
//         // cout << name << "  id:" << pthread_self() << "=" << hexAddr(pthread_self()) << endl;
//         // cout << "  &cnt:" << &cnt << endl;
//         cout << name << " val:" << val-- << "  &val:" << &val << endl;
//         cnt--;
//         sleep(1);
//     }
// }

// int main(){


//     //验证线程独立栈
//     pthread_t t1, t2, t3;
//     pthread_create(&t1, nullptr, threadRoutine, (void *)"thread 1");
//     pthread_create(&t2, nullptr, threadRoutine, (void *)"thread 2");
//     pthread_create(&t3, nullptr, threadRoutine, (void *)"thread 3");

//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);

//     // pthread_t tid;
//     // pthread_create(&tid, nullptr, threadRoutine, (void *)"thread 1");

//     // // //在主线程中分离子线程
//     // // pthread_detach(tid);
//     // sleep(1);

//     // while(1){
//     //     cout << "main thread:" << pthread_self() << " = " << hexAddr(pthread_self()) << endl;
//     //     sleep(1);
//     // }

//     // int n = pthread_join(tid, nullptr);
//     // if(n!=0){
//     //     cerr << "error:" << n << ":" << strerror(n) << endl;
//     // }
//     return 0;
// }





//模拟多线程并发抢票
int tickets = 1000;

pthread_mutex_t mutex;

void* threadBuyTickets(void* name){
    string tname = static_cast<const char *>(name);


    while(1){

        //加锁
        pthread_mutex_lock(&mutex);
        
        if(tickets>0){
            usleep(1000);
            cout << tname << "get tickets, remain tickets:" << tickets-- << endl;
            pthread_mutex_unlock(&mutex);

        }else{
            pthread_mutex_unlock(&mutex);
            break;
        }
    }

    usleep(1000);

    return nullptr;
}

int main(){

    //初始化锁
    pthread_mutex_init(&mutex, nullptr);

    pthread_t t[4];
    for (int i = 0; i < 4;i++){
        char *data = new char[64];
        snprintf(data, 64, "thread-%d", i + 1);
        pthread_create(t + i, nullptr, threadBuyTickets, data);
    }

    for (int i = 0;i<4;i++){
        pthread_join(t[i], nullptr);
    }

    //销毁锁
    pthread_mutex_destroy(&mutex);


    return 0;
}